import axios, { AxiosRequestConfig, AxiosResponse, Method } from "axios"
import axiosConfig from "./config"
import { showMessage } from "./status"
import { ElMessage } from "element-plus"
import { store } from "/@/store"

interface PendingType {
  url?: string
  method?: Method
  params: any
  data: any
  cancel: Function
}

// 使用 cancel token 取消请求
const { CancelToken } = axios
// 取消重复请求
const repeatRequstList: Array<PendingType> = []

// 创建axios实例 import.meta.env.VITE_APP_XXX_SERVICE_URL
const service = axios.create({
  baseURL: import.meta.env.VUE_APP_API_BASE_URL as string | undefined, // 断言，不然报错
  ...axiosConfig
})

// 移除重复请求
const removePending = (config: AxiosRequestConfig) => {
  for(const key in repeatRequstList) {
    console.log(key, "key")
    const item:number = +key
    const list: PendingType = repeatRequstList[key]
    // 当前请求在数组中存在时执行函数体
    if(list.url === config.url && list.method === config.method && 
      JSON.stringify(list.params) === JSON.stringify(config.params) 
    && JSON.stringify(list.data) === JSON.stringify(config.data)) {
      // 执行取消操作
      console.log("操作太频繁，请稍后再试")
      // 从数组中移除记录
      repeatRequstList.splice(item,1)
    }
  }
}


// request拦截器axios的一些配置
service.interceptors.request.use(
  (config) => {
    // store.commit('showLoading')

    removePending(config)
    config.cancelToken = new CancelToken((c) => {
      repeatRequstList.push({
        url:config.url,
        method: config.method,
        params: config.params,
        data:config.data,
        cancel:c
      })
    })
    return config
  },
  (error:any) => {
    // console.error("error:", error)
    // store.commit('hideLoading')
    Promise.reject(error) 
  }
)

// response 拦截器 axios的一些配置
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // store.commit("hideLoading")
    removePending(response.config)

    const { data, status } = response
    if(status === 200 || status === 304) {
      // const auth = headers && headers.authorization || '';
      // if(auth) setStorage('authorization',auth)
      if(data && data.errcode === "0") {
        return data.data
      }else {
        ElMessage.error(data.errmsg)
      }
    }else {
      ElMessage.error(showMessage(status))
      return Promise.reject(new Error(data.message || "Error"))
    }
  },
  (error: any) => {
    const { response } = error
    if(response) {
      // 请求已发出，但是不在2xx范围
      ElMessage.error(showMessage(response.status))
      return Promise.reject(error)
    }else {
      ElMessage.warning("网络连接异常,请稍后再试!")
    }
  }
)

// const request = (options = {}):Promise<any> => {
//   return new Promise((resolve,reject) => {
//     service(options).then((response:AxiosResponse) => {
//       const { data, status,statusText } = response
//       console.log(data)
//       if(status === 200 || status === 304) {
//         // const auth = headers && headers.authorization || '';
//         // if(auth) setStorage('authorization',auth)
//         if(data && data.errcode === "0") {
//           return resolve([null,data])
//         }
//         return [
//           data.data 
//             ? data.errcode === "999" && !data.errmsg ? { errmsg: "系统内部错误" } : data.data 
//             : { errmsg:data.errmsg,err:data }
//         ]
//       }else {
//         ElMessage.error(showMessage(status))
//         return reject(statusText)
//       }
//     })
//       .catch((error:any) => {
//         return reject(error)
//       })
//   })
// }

const get = (url:string,params = {}):Promise<any> => {
  return service({
    url,
    method:"get",
    params:`${JSON.stringify(params)}`
  })
}

const post = (url:string,params = {}):Promise<any> => {
  return service({
    url,
    method:"post",
    data:`${JSON.stringify(params)}`
  })
}

// 取消重新请求，将获得cancelToken方法绑定到每个方法上面，方便调用的时候使用
// ;[request,get,post,service].forEach(item => {
//   item.getCancelToken = () => {
//     return axios.CancelToken
//   }
// })

export { get, post } 